package com.xqf.text.wxpay.controller;

import com.github.wxpay.sdk.WXPayUtil;
import com.xqf.text.wxpay.service.wxPayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author cxk
 * @date 2020/11/4 17:28
 */
@RequestMapping(value = "/wxpay")
@RestController
public class wxPayController {

    @Autowired
    private wxPayService wxPayService;

    /**
     * 通过订单号创建微信二维码
     * @param orderid
     * @return
     */
    @GetMapping("/index")
    public Object create(@RequestParam String orderid){
        Map<String, String> param = new HashMap<>();
        param.put("orderid", orderid);
        Map map = wxPayService.nativeCreateCode(param);
        return map;
    }

    /**
     * 查询支付后的订单状态
     * @param orderid
     * @return
     */
    @GetMapping("/query")
    public Object query(@RequestParam String orderid){
        Map map = wxPayService.queryOrder(orderid);
        return map;
    }

    /**
     * 异步通知
     * @param request
     * @return
     * @throws Exception
     */
    @RequestMapping("/notify/url")
    public String notifyurl(HttpServletRequest request) throws Exception{
        //获取网络输入流
        ServletInputStream inputStream = request.getInputStream();
        //缓冲区
        byte[] buffer = new byte[1024];
        //输入流
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        // != -1 代表有数据 将数据写入到对象中去
        int leng = 0;
        while ((leng = inputStream.read(buffer)) != -1){
            byteArrayOutputStream.write(buffer, 0, leng);
        }
        //支付的字节数组 转换成string
        byte[] bytes = byteArrayOutputStream.toByteArray();
        String xmlStr = new String(bytes, "UTF-8");
        //转map
        Map<String, String> map = WXPayUtil.xmlToMap(xmlStr);
        /**
         * 做到这里就可以调用service中的修改订单,创建物流，修改支付状态的结果了,后面的就没必要在写了
         * 如果自己玩玩的话就无所谓，如果是商业的话这个地方就可以用到队列了，redis kafka RabbitMQ MQTT等都可以
         * 关于消息队列的请看我其他的博客
         * result_code = success
         * return_code = success
         * 准确的来说是需要这两个家伙都为success的时候才去修改订单状态
         * 微信文档不错，好好看下就明白了
         */
        //打印结果集
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println("列名:" + entry.getKey() + "值是:" + entry.getValue());
        }
        //偷个懒直接返回响应数据
        String str = "<xml><return_code><![CDATA[SUCCESS]]>" +
                "</return_code><return_msg><![CDATA[OK]]>" +
                "</return_msg></xml>";
        return str;
    }
}
